home *** CD-ROM | disk | FTP | other *** search
/ MACD 5 / MACD 5.bin / workbench / libs / unixlib.lha / unix / src / fstat.c < prev    next >
C/C++ Source or Header  |  1996-11-10  |  1KB  |  58 lines

  1. #include "amiga.h"
  2. #include <dos/dosextens.h>
  3. #include <utility/tagitem.h>
  4. #include <sys/types.h>
  5. #include <sys/stat.h>
  6. #include <amiga/ioctl.h>
  7.  
  8. int ioctl(int fd, int request, void *data);
  9.  
  10. int fstat(int fd, struct stat *sbuf)
  11. {
  12.     BPTR fh, lock;
  13.     long handler;
  14.     struct FileInfoBlock *fib;
  15.     int ret;
  16.  
  17.     __chkabort();
  18.     if (ioctl(fd, _AMIGA_GET_FH, &fh) == -1)
  19.     return -1;
  20.     if ((lock = DupLockFromFH(fh)) || (lock = ParentOfFH(fh))) {
  21.     handler = (long) ((struct FileLock *)((long)lock << 2))->fl_Task;
  22.     UnLock(lock);
  23.     } else {
  24.     /* we're really unlucky, but if it's not a dir, this is equivalent */
  25.     handler = (long) (((struct FileHandle *) BADDR(fh))->fh_Type);
  26.     }
  27.     if ((fib = AllocDosObjectTags(DOS_FIB, TAG_END)) && ExamineFH(fh, fib)) {
  28.     _fibstat(fib, 0, sbuf, handler);
  29.     ret = 0;
  30.     } else {
  31.     int err = IoErr();
  32.  
  33.     if (err == ERROR_ACTION_NOT_KNOWN)
  34.         /* Fake a stat result */
  35.     {
  36.         ret = 0;
  37.         sbuf->st_dev = handler;
  38.         sbuf->st_ino = 0;
  39.         sbuf->st_mode = 0777;
  40.         sbuf->st_nlink = 1;
  41.         sbuf->st_uid = AMIGA_UID;
  42.         sbuf->st_gid = AMIGA_GID;
  43.         sbuf->st_blksize = 512;
  44.         sbuf->st_blocks = 0;
  45.         sbuf->st_size = 0;
  46.         /* 1-Jan-1978 */
  47.         sbuf->st_ctime = sbuf->st_atime = sbuf->st_mtime = 252460800;
  48.     } else {
  49.         ret = -1;
  50.         errno = convert_oserr(err);
  51.     }
  52.     }
  53.     if (fib)
  54.     FreeDosObject(DOS_FIB, fib);
  55.     ioctl(fd, _AMIGA_FREE_FH, &fh);
  56.     return ret;
  57. }
  58.